 1.Spark原理之BlockManager
   
   BlockManager是一个嵌入在 Spark 中的 key-value型分布式存储系统，也是 Master-Slave 结构的，RDD-cache、
shuffle-output、broadcast 等的实现都是基于BlockManager来实现的：
       shuffle 的过程中使用 BlockManager 作为数据的中转站
       将广播变量发送到 Executor 时， broadcast 底层使用的数据存储层
	   spark streaming 一个 ReceiverInputDStream 接收到的数据，先放在 BlockManager 中， 然后封装为一个
BlockRdd 进行下一步运算
       如果对一个 RDD 进行了cache，CacheManager 也是把数据放在了 BlockManager 中， 后续 Task 运行的时候
可以直接从 CacheManager 中获取到缓存的数据,不用再从头计算
   
   BlockManager也是分布式结构，在Driver和所有Executor上都会有BlockManager。每个节点上存储的block信息都
会汇报给Driver端的BlockManager Master作统一管理，BlockManager对外提供get和set数据接口，可将数据存储
在Memory、Disk、Off-heap。
   Driver 上有 BlockManager Master，负责对各个节点上的 BlockManager 内部管理的数据的元数据进行维护，比如
block 的增删改等操作，都在这里维护好元数据的变更。
   每个节点都有一个 BlockManager，每个 BlockManager 创建之后，第一件事就是去向 BlockManager Master 进行
注册，此时 BlockManager Master 会为其创建对应的 BlockManagerInfo。
   Driver的组件为BlockManager Master，负责：
        各节点上BlockManager内部管理数据的元数据进行维护，如 block 的增、删、改、查等操作
		只要 BlockManager 执行了数据增、删、改操作，那么必须将 Block 的 BlockStatus 上报到BlockManager
Master，BlockManager Master会对元数据进行维护
   BlockManager运行在所有的节点上，包括所有 Driver 和 Executor 上：
        BlockManager对本地和远程提供一致的get和set数据块接口,BlockManager本身使用不同的存储方式来存储
这些数据，包括memory、disk、off-heap 
        BlockManager负责Spark底层数据存储与管理，Driver和Executor的所有数据都由对应的BlockManager进行
管理
        BlockManager创建后，立即向 BlockManager Master进行注册，此时BlockManager Master会为其创建对应
的BlockManagerInfo
        BlockManager中有3个非常重要的组件：
		    DiskStore：负责对磁盘数据进行读写
            MemoryStore：负责对内存数据进行读写
			BlockTransferService：负责建立到远程其他节点BlockManager的连接，负责对远程其他节点的
BlockManager的数据进行读写
        使用BlockManager进行写操作时，如RDD运行过程中的中间数据,或者执行persist操作,会优先将数据写入内
存中.如果内存大小不够,将内存中的部分数据写入磁盘:如果persist指定了要replica,会使用BlockTransferService
将数据复制一份到其他节点的BlockManager上去
        使用 BlockManager进行读操作时,如Shuffle Read操作,如果能从本地读取,就利用DiskStore或MemoryStore 
从本地读取数据；如果本地没有数据，就利用 BlockTransferService 从远程 BlockManager读取数据